#include<bits/stdc++.h>
using namespace std;
const int N=100004;

int n,m;
int price[N];
vector<int> edges[N];
vector<int> edges2[N];
bool visit1[N],visitn[N];
int minn[N];
int in[N],in2[N];

int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) {
        scanf("%d",&price[i]);
    }
    for(int i=1;i<=m;i++){
        int s,t,ty;
        scanf("%d%d%d",&s,&t,&ty);
        if(ty==1){
            edges[s].emplace_back(t);
            in[t]++;
            edges2[t].emplace_back(s);
            in2[s]++;
        }else{
            edges[s].emplace_back(t);
            edges[t].emplace_back(s);
        }
    }
    queue<int> que;
    que.push(1);
    minn[1]=price[1];
    while(!que.empty()){
        int s=que.front();
        que.pop();
        for(auto t:edges[s]){
            visit1[t]=true;
            minn[t]=min(price[t],minn[s]);
            in[t]--;
            if(in[t]==0){
                que.push(t);
            }
        }
    }
    // for(int i=1;i<=n;i++){
    //     cout<<i<<" "<<minn[i]<<endl;
    // }
    //
    memset(visitn,0,sizeof(visitn));
    que.push(n);
    visitn[n]=true;
    while(!que.empty()){
        int s=que.front();
        que.pop();
        for(auto t:edges2[s]){
            if(visitn[t]) continue;
            que.push(t);
            visitn[t]=true;
        }
    }
    int res=0;
    for(int i=1;i<=n;i++){
        if(visit1[i]&&visitn[i]){
            res=max(res,price[i]-minn[i]);
        }
    }
    printf("%d",res);
    return 0;
}
/*
5 5 
4 3 5 6 1 
1 2 1 
1 4 1 
2 3 1
3 5 1 
4 5 1 
*/